class Alg<E extends Comparable<E>>{
    //这就是泛型上界的语法，意为：将来指定的参数类型一定是实现了这个接口
    /*如果写为 <E extends Number> 意为：E是Number的子类或者E是Number本身*/
    public E findMax(E[] array){
        E max = array[0];
        for (int i = 1;i < array.length;i++){
            if(max.compareTo(array[i]) < 0){//大于小于号两端如果是基本类型可以直接比较，但是E是引用类型，要用compare比较
                //E在运行时被擦除为object，而object类没有实现compare接口，所以max无法调用该方法
                max = array[i];
            }
        }
        return max;
    }
}
class A<E extends Number>{

}
class Alg3{
    public <E extends Comparable<E>> E findMax(E[] array){
        E max = array[0];
        for (int i = 1;i < array.length;i++){
            if(max.compareTo(array[i]) < 0){
                max = array[i];
            }
        }
        return max;
    }
}
class Alg2{
    public static <E extends Comparable<E>> E findMax(E[] array){
        E max = array[0];
        for (int i = 1;i < array.length;i++){
            if(max.compareTo(array[i]) < 0){
                max = array[i];
            }
        }
        return max;
    }
}
public class Test3 {
    public static void main(String[] args) {
        Integer[] array = {1,2,3,4,5,6,7};
        Integer val = Alg2.<Integer>findMax(array);
        System.out.println(val);
    }
    public static void main3(String[] args) {
        Alg2 alg2 = new Alg2();
        Integer[] array = {1,2,3,4,5,6,7};
        Integer val = alg2.<Integer>findMax(array);//"<integer>可省略"
        System.out.println(val);
    }
    public static void main2(String[] args) {
        A<Number> a1 = new A<>();//写法一
        A<Integer> a2 = new A<>();//写法二
        A<Double> a3 = new A<>();//写法三
        //写法二和三可以是因为那两个泛型参数是Number的子类
       /* A<String> a4 = new A<>();
        这种写法就不行，因为String不是Number的子类*/
    }
    public static void main1(String[] args) {
        Alg<Integer> alg = new Alg<>();
        Integer[] array = {1,2,3,4,5,6,7};
        Integer val = alg.findMax(array);
        System.out.println(val);
/*        Alg<A> alg1 = new Alg<>();
* 假如我们在这里写了上面这个语句，将会报错。因为class A 没有实现comparable接口*/
    }
}
